unit InternetPagina_Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw_EWB, MSHTML, EwbCore, EmbeddedWB;

type
  TTriggerTVGidsNLDownload = procedure() of object;
  TProcessTVGidsNLDownload = procedure(pagina: IHTMLDocument2) of object;
  TD_TaskbarLocatie = (TB_ONDER, TB_BOVEN, TB_RECHTS, TB_LINKS);

  TInternetPagina_Form = class(TForm)
    EmbeddedWB: TEmbeddedWB;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure EmbeddedWBDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  private
    { Private declarations }
    triggerTVGidsNLDownload: TTriggerTVGidsNLDownload;
    processTVGidsNLDownload: TProcessTVGidsNLDownload;
    procedure instellingFormLocatie();
    procedure bureaubladVerandering( var Msg: TMessage); message WM_SETTINGCHANGE;
  public
    { Public declarations }
    function  getPersoonlijkeVolledigOverzichtGenrePagina() : String;
    procedure showInternetPagina(pagina: String);
    procedure hideInternetPagina();
    property var_TriggerTVGidsNLDownload: TTriggerTVGidsNLDownload read triggerTVGidsNLDownload write triggerTVGidsNLDownload;
    property var_ProcessTVGidsNLDownload: TProcessTVGidsNLDownload read processTVGidsNLDownload write processTVGidsNLDownload;
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
  end;

implementation

  {$R *.dfm}

  {
    *
  }
  function TInternetPagina_Form.getPersoonlijkeVolledigOverzichtGenrePagina() : String;
  begin

    //controleren of de huidige InternetPagina zichtbaar is
    if not Self.Visible then
    begin

      //Persoonlijke TVGidsNL Volledig Overzicht op Genre ophalen
      EmbeddedWB.Go('http://www.tvgids.nl/perstvgids/compleet/genre/0/');
    end;
  end;

  {
    *
  }
  procedure TInternetPagina_Form.showInternetPagina(pagina: String);
  begin

    //gevraagde webpagina openen
    EmbeddedWB.Go(pagina);

    //internet pagina tonen
    Self.Show();
  end;

  {
    *
  }
  procedure TInternetPagina_Form.hideInternetPagina();
  begin

    //geen cash opschonen aangezien dan het cookie van de login ook is verdwenen
    //EmbeddedWB.ClearCache();

    //internet pagina verbergen als deze nog zichtbaar is
    if Visible then
      Self.Hide();

    //TVScannerManager triggeren dat er actie kan worden ondernomen
    triggerTVGidsNLDownload();
  end;

  {
    * FormClose
  }
  procedure TInternetPagina_Form.FormClose(Sender: TObject;
  var Action: TCloseAction);
  begin

    //form niet vrijgeven maar alleen verbergen
    Action := caNone;

    //tvgids.nl webpagina niet meer tonen om geheugen te besparen
    hideInternetPagina();
  end;


  {
    * instellingFormLocatie regelt de positie van de internetPagina_Form als het windows taskbar wordt verplaatst
  }
  procedure TInternetPagina_Form.instellingFormLocatie();
  var
    hTaskbar: HWND;
    werkvlakOppervlak: TRect;
    taskbarOppervlak: TRect;
    taskbarLocatie: TD_TaskbarLocatie;
  begin
    //controleren taskbar locatie

    //locatie van taskbar ophalen
    hTaskBar := FindWindow( 'Shell_TrayWnd', nil );
    GetWindowRect( hTaskBar, taskbarOppervlak );

    //ophalen workspace van bureaublad
    systemparametersinfo (SPI_GETWORKAREA,0,@werkvlakOppervlak,0);


    //bepalen locatie taskbar
    taskbarLocatie := TB_RECHTS;
    if ( ( taskbarOppervlak.Top > (werkvlakOppervlak.Bottom Div 2) ) And ( taskbarOppervlak.Right >= werkvlakOppervlak.Right ) ) Then
        taskbarLocatie := TB_ONDER
    else
    if ( ( taskbarOppervlak.Top < (werkvlakOppervlak.Bottom Div 2) ) And ( taskbarOppervlak.Bottom <= werkvlakOppervlak.Right Div 2 ) ) Then
        taskbarLocatie := TB_BOVEN
    else
    if ( ( taskbarOppervlak.left < (werkvlakOppervlak.Right Div 2) ) And ( taskbarOppervlak.Top <= 0 ) ) Then
        taskbarLocatie := TB_LINKS;

    //taskbar onder
    case taskbarLocatie of

      //de form rechts onder in beeld zetten
      TB_ONDER: begin
                  left:=werkvlakOppervlak.right-Self.width;
                  top:=werkvlakOppervlak.bottom-Self.height;
                end;
      //de form rechts boven in beeld zetten
      TB_BOVEN: begin
                  left:=werkvlakOppervlak.right-Self.width;
                  top:=werkvlakOppervlak.Top;
                end;
      //de form rechts boven in beeld zetten
      TB_RECHTS: begin
                   left:=werkvlakOppervlak.right-Self.width;
                   top:=werkvlakOppervlak.Top;
                end;
      //de form links onder in beeld zetten
      TB_LINKS: begin
                  left:=werkvlakOppervlak.Left;
                  top:=werkvlakOppervlak.bottom-Self.height;
                end;
    end;
  end;

  {
    * bureaubladVerandering
  }
  procedure TInternetPagina_Form.bureaubladVerandering(var Msg: TMessage);
  begin

    //controleren of het om een workArea message gaat
    if (Msg.WParam=SPI_SETWORKAREA) then
    begin

      //locatie van het form aanpassen
      instellingFormLocatie();
    end;
  end;

  {
    * EmbeddedWBDocumentComplete
  }
  procedure TInternetPagina_Form.EmbeddedWBDocumentComplete(ASender: TObject;const pDisp: IDispatch; var URL: OleVariant);
  var
    CurWebrowser : IWebBrowser;
    TopWebBrowser: IWebBrowser;
  begin
  
    //internet pagina de focus geven om direct te kunnen scrollen
    EmbeddedWB.SetFocusToDoc();  

    //controleren of de internetPagina zichtbaar is
    if not Self.Visible then
    begin

      //controleren of dit event de top level is (we willen niet een x keer hetzelfde parsen)
      CurWebrowser  := pDisp as IWebBrowser;
      TopWebBrowser := (ASender as TEmbeddedWB).DefaultInterface;
      if CurWebrowser=TopWebBrowser then
      begin

        //controleren of het huidige HTML body het persoonlijke TVGids overzicht is
        processTVGidsNLDownload(IHTMLDocument2(EmbeddedWB.Document));
      end;
    end;
  end;

  {
    * AfterConstruction
  }
  procedure TInternetPagina_Form.AfterConstruction;
  begin

    //locatie van het form aanpassen
    instellingFormLocatie();

    //internetPagina inialiseren door deze in 100% alphablending te tonen (onzichtbaar)

    //alphablending enabled zetten
    Self.AlphaBlend := True;

    //alphablending op 100% doorzichtheid zetten
    Self.AlphaBlendValue := 0;

    //internetPagina form tonen
    Self.Show();

    //internetPagina form verbergen
    Self.Hide();

    //alphablending disabled zetten
    Self.AlphaBlend := False;      
  end;

  {
    * BeforeDestruction
  }
  procedure TInternetPagina_Form.BeforeDestruction;
  begin

  end;

end.
